
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Redis 高可用与集群 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Redis 高可用与集群 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在生产环境中，使用单机 Redis 面临哪些主要挑战？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">单机 Redis 在生产环境中主要面临三大挑战：1. 单点故障：节点一旦故障，整个服务将不可用。2. 可扩展性问题：随着数据量增长，单个节点的内存限制会成为性能瓶瓶颈。3. 高可用性需求：需要确保在节点宕机或网络中断时，服务依然可用。</div>
          </div>
          <div class="card-source">来源: Redis 高可用与集群的背景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Redis Sentinel 的核心工作原理是什么？它如何解决主从复制的单点故障问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis Sentinel 是一个高可用性管理工具，其工作原理包括：1. 故障检测：定期监控主从节点的健康状况。2. 故障转移：当检测到主节点故障时，会自动将一个从节点提升为新的主节点。3. 客户端重定向：更新状态信息，确保客户端能连接到新的主节点。通过这种自动化的故障转移机制，它解决了主从复制模式下主节点宕机导致服务不可用的单点故障问题。</div>
          </div>
          <div class="card-source">来源: Redis 高可用性概述 -> 2. Redis Sentinel</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">基于主从复制和 Sentinel 的 Redis 高可用方案存在哪些主要缺点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该方案主要有两个缺点：1. 数据一致性问题：由于主从复制是异步的，从节点的数据可能落后于主节点，存在数据延迟。2. 故障转移延迟：Sentinel 的故障转移过程需要一定时间，在此期间系统可能会出现短暂的不可用状态。</div>
          </div>
          <div class="card-source">来源: Redis 高可用性概述 -> 4. Redis 高可用性的优缺点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Redis 集群是如何实现数据分片（Sharding）的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis 集群通过哈希槽（hash slots）机制来实现数据分片。整个集群共有 16384 个哈希槽，当存储一个键值对时，集群会根据键（key）计算出其对应的哈希槽，然后将数据存储到负责该哈希槽的节点上，从而实现数据在多个节点间的均匀分布。</div>
          </div>
          <div class="card-source">来源: Redis 集群架构 -> 1. Redis 集群的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Redis 集群中的节点之间是如何进行通信以保持状态同步的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis 集群的节点之间通过 Gossip 协议进行通信。节点会定期交换信息，以保持整个集群状态的同步。通过这种方式，集群能够及时发现节点的故障并触发相应的故障转移等处理过程。</div>
          </div>
          <div class="card-source">来源: Redis 集群架构 -> 1. Redis 集群的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">相较于仅实现高可用的方案，Redis 集群架构提供了哪些核心优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis 集群架构的核心优势在于：1. 水平扩展：通过数据分片，可以方便地增加节点来满足更大的存储和计算需求。2. 高可用性：内建了主从复制和自动故障转移机制。3. 高吞吐量：数据分片实现了负载均衡，避免了单点性能瓶颈。</div>
          </div>
          <div class="card-source">来源: Redis 集群架构 -> 5. Redis 集群的优缺点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">“高可用性（HA）”和“集群（Cluster）”在设计目标上有什么根本区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">高可用性（HA）的主要目标是保证服务的持续可用性，通过冗余和故障恢复机制最大限度地减少服务停机时间。而集群（Cluster）的主要目标是通过多节点的分布式架构来提升系统的整体性能和容量，侧重于通过水平扩展来分担负载。</div>
          </div>
          <div class="card-source">来源: 高可用与集群的对比 -> 2. 目标</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">根据 CAP 定理，Redis 集群在默认配置下是如何进行权衡的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在 CAP 定理（一致性、可用性、分区容错性）中，Redis 集群的默认配置偏向于保证可用性（Availability）和分区容错性（Partition tolerance）。这意味着在发生网络分区时，集群会优先保证部分节点能够继续提供服务，但这可能会牺牲数据的强一致性（Consistency）。</div>
          </div>
          <div class="card-source">来源: Redis 集群的故障恢复与数据一致性 -> 2.3 CAP 定理与一致性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">问题与解决</div>
          <div class="card-question">在 Redis 集群中，如何应对可能导致数据丢失的网络分区（“脑裂”）问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">问题与解决</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">应对网络分区问题可以采取以下措施：1. 启用防脑裂机制：利用 `cluster-config-epoch` 标识集群版本，确保分区后只有一个“最健康”的分区能继续操作。2. 增加副本数：增加从节点的数量可以降低单分区故障导致数据丢失的风险。3. 使用 Sentinel 等工具：进行更智能的故障检测和自动恢复。</div>
          </div>
          <div class="card-source">来源: Redis 高可用与集群的常见问题与解决方案 -> 1. 网络分区与数据不一致</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
